/* 
   此模块是用来进行用户登录及登出的
*/
import {reqCode,reqRegister,reqUserLogin,reqGetUserInfo,reqUserLogout} from '../../api'

const state = {
     code:'',
    // token:'',  //登录的时候我们是空串，刷新页面token丢失，信息拿不到
      token:localStorage.getItem('token_key'),
     userInfo:{},
     
}

const  mutations = { 
     //接收验证码
      RECEIVE_CODE(state,code){
           state.code = code
     },
     //接收token
      RECEIVE_TOKEN(state,token){
           state.token = token
     },
     //接收用户信息（nickName,name）
      RECEIVE_USERINFO(state,userInfo){
           state.userInfo = userInfo
     },
     //重置用户信息
     RESET_USERINFO(state){
          state.token = '',
          state.userInfo ={}
     }
}

const  actions = {
     // async函数叫异步函数
     // 一般在异步函数当中都是一些异步的操作
     // async函数返回值一定是promise，不看return
     // 返回的promise成功还是失败看return 
     // 如果return的值：
     // promise值和非promise值
     // 如果是非promise值，那么函数返回的promise状态就是成功的，成功的结果就是return的结果
     // 如果是非promise值，但是中间抛出异常，那么函数返回的promise状态就是失败的，失败的原因就是抛出的异常
     // 如果是promise值，return返回的promise是成功的，那么函数返回的promise就是成功的，
               // 成功的结果就是return的promise成功的结果
     // 如果是promise值，return返回的promise是失败的，那么函数返回的promise就是失败的
     // 失败的原因就是return的promise失败的原因


     //1.获取验证码
     async getCode({commit},phone){
          const result = await reqCode(phone)
          if(result.code === 200){
                commit('RECEIVE_CODE',result.data)
                return result.data
          }else {
                return Promise.reject(new Error('failed'))
          }
     },

     //2.注册
     // eslint-disable-next-line no-unused-vars
     async  userRegister({commit},user){
        const result = await  reqRegister(user)
        if(result.code === 200){
            return  'OK'
        }else{
            return  Promise.reject(new Error('failed'))
        }
     },

     //3.登录
     async userLogin({commit},user){
         const result = await reqUserLogin(user)
         if(result.code === 200){
               // 保证第一次可以通过token拿到用户信息
               // 如果不写,第一次登录完成,state里面是没有保存token的,获取用户信息的时候我们从state里面
                // 就拿不到token
              commit('RECEIVE_TOKEN',result.data.token)//如果不写这行代码，第一次登录成功后用户名和退出登录不会显示，
              //因为state里面的token是没有信息的，数据不会渲染到页面，token保存到本地后，刷新才从本地拿到token信息
              //自动登录（免登录），把token信息保存本地
              localStorage.setItem('token_key',result.data.token)
              return 'ok'
         }else {
              return Promise.reject(new Error('failed'))
         }
     },

     //4.根据token获取用户信息 
     async getUserInfo({commit}){
        const  result = await  reqGetUserInfo()
        if(result.code === 200){
              commit('RECEIVE_USERINFO',result.data)
              return 'ok'
        }else {
              return Promise.reject(new Error('failed'))
        }
     },

     //5.退出登录 
    async userLogout({commit}){
           const result = await reqUserLogout()
           if(result.code === 200){
                localStorage.removeItem('token_key')
                commit('RESET_USERINFO')
                 return 'ok'
           }else{
               return Promise.reject(new Error('failed'))
           }
     }
}

const getters = {}

export default {
      namespaced:true, //开启命名空间
      state,
      mutations,
      actions,
      getters
}